home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s_tool / picsave_.has < prev    next >
Text File  |  1997-10-17  |  20KB  |  898 lines

  1. *    PIC Save Routine
  2. *    written by GORRY.
  3. *    $Id: picsave.ap,v 2.0.0.5 1995/09/26 01:03:23 GORRY Exp GORRY $
  4.  
  5.  
  6.         .cpu    68000
  7.  
  8.  
  9.         dc.b    '$Id: picsave.ap,v 2.0.0.5 1995/09/26 01:03:23 GORRY Exp GORRY $',0
  10.         .even
  11.  
  12.  
  13.         .include    %APMacro.$$$    *@APSTART;
  14.         *@STRINGS;
  15.  
  16.         .include    iocscall.mac
  17.         .include    doscall.mac
  18.         .include    GORRY.mac
  19.  
  20.         .include    apicgsub.ap
  21. icgsub.ap 1
  22.         .include    picsave.h
  23.  
  24.  
  25. *    *    *    *    *    *    *    *    *    *
  26.  
  27.  
  28. _PICSAVE::
  29. *    int PICSAVE(
  30. *            UWORD *SaveBuf,
  31. *            char *FileName,
  32. *            long SaveX1, long SaveY1, long SaveX2, long SaveY2,
  33. *            UBYTE *CommentBuf,
  34. *            UBYTE *FileBuf, long FileBufSize,
  35. *            ULONG Flag
  36. *    )
  37. *
  38. *    SaveBuf        圧縮元バッファを差すポインタ。通常はGRAM_STARTを差している。常にワードアクセスされる。
  39. *    FileName    セーブするファイル名を差すポインタ。
  40. *    SaveX1        圧縮開始Xドット位置。負で左端。画面をはみ出さないこと。
  41. *    SaveY1        圧縮開始Yドット位置。負で上端。画面をはみ出さないこと。
  42. *    SaveX2        圧縮終了Xドット位置。負で右端。画面をはみ出さないこと。
  43. *    SaveY2        圧縮終了Yドット位置。負で左端。画面をはみ出さないこと。
  44. *    CommentBuf    コメント文字列の先頭を差すポインタ。$00で終わっていること。
  45. *    FileBuf        ファイル書き込み用バッファを差すポインタ。常にワードアクセスされる。
  46. *    FileBufSize    ファイル書き込み用バッファサイズ。128バイト以上必要。
  47. *    Flag        動作制御フラグ。
  48. *            bit0    1で拡張ヘッダをコメントに挿入しない。
  49. *            bit2    1でbit16以降の情報ビットを使用する。
  50. *            bit15    1でメモリイメージとしてセーブする。
  51. *            bit16    0で31KHz・1で15KHz(/XFL)
  52. *            bit17    0で非正方形・1で正方形(/XSS)
  53. *
  54. *    return        0でセーブ成功、負でエラー。
  55.  
  56.         clr.w    -(sp)
  57.         BRA    _PICSAVE_
  58.  
  59. _M_PICSAVE::
  60. *    int M_PICSAVE(
  61. *            UWORD *SaveBuf,
  62. *            long *SaveSize,
  63. *            long SaveX1, long SaveY1, long SaveX2, long SaveY2,
  64. *            UBYTE *CommentBuf,
  65. *            UBYTE *FileBuf, long FileBufSize,
  66. *            ULONG Flag
  67. *    )
  68. *
  69. *    SaveBuf        圧縮元バッファを差すポインタ。通常はGRAM_STARTを差している。常にワードアクセスされる。
  70. *    SaveSize    セーブメモリの使用バイト数を返すメモリへのポインタ。
  71. *    SaveX1        圧縮開始Xドット位置。負で左端。画面をはみ出さないこと。
  72. *    SaveY1        圧縮開始Yドット位置。負で上端。画面をはみ出さないこと。
  73. *    SaveX2        圧縮終了Xドット位置。負で右端。画面をはみ出さないこと。
  74. *    SaveY2        圧縮終了Yドット位置。負で左端。画面をはみ出さないこと。
  75. *    CommentBuf    コメント文字列の先頭を差すポインタ。$00で終わっていること。
  76. *    FileBuf        セーブメモリへのポインタ。常にワードアクセスされる。
  77. *    FileBufSize    セーブメモリのサイズ。
  78. *    Flag        動作制御フラグ。
  79. *            bit0    1で拡張ヘッダをコメントに挿入しない。
  80. *            bit15    1でメモリイメージとしてセーブする。
  81. *
  82. *    return        0でセーブ成功、負でエラー。
  83.  
  84.         ST.b    -(sp)
  85.  
  86. _PICSAVE_:
  87.         movem.l    d1-d7/a0-a6,-(sp)
  88.                         * パラメータ
  89.         lea    4*14+6(sp),a0
  90.                         * ローカル変数領域を取得
  91.         link    a5,#-LocalSize
  92.         lea    -(LocalSize+LocalOffset)(a5),a5
  93.                         * 大域脱出用
  94.         lea    A5Back(pc),a1
  95.         move.l    a5,(a1)
  96.                         * スーパーバイザモードへ
  97.         clr.l    -(sp)
  98.         DOS    _SUPER
  99.         move.l    d0,(sp)
  100.                         * 本体をコール
  101.         bsr    PicSave
  102.  
  103.                         * エラーコードを退避
  104.         move.l    d0,d1
  105.  
  106.         tst.l    (sp)
  107.         AP_IFmac0000    *@ifpl    {
  108.             DOS    _SUPER
  109.         AP_ENDIFmac0000    *}
  110.         addq.w    #4,sp
  111.                         * エラーコード復帰
  112.         move.l    d1,d0
  113.  
  114.         lea    (LocalSize+LocalOffset)(a5),a5
  115.         unlk    a5
  116.         movem.l    (sp)+,d1-d7/a0-a6
  117.         addq.w    #2,sp
  118.  
  119.         rts
  120.  
  121.  
  122. *    *    *    *    *    *    *    *    *    *
  123.  
  124.  
  125. PicSave:
  126. *        in    a0    Stack上のパラメータを差すポインタ
  127. *        out    d0    エラーコード
  128.  
  129.                         * 大域脱出用
  130.         move.l    sp,@@Stack(a5)
  131.  
  132.                         * パラメータを格納する
  133.         move.w    -6(a0),d0
  134.         move.l    (a0)+,@@SaveBufPtr(a5)
  135.         move.l    (a0)+,@@FileNamePtr(a5)
  136.         move.l    (a0)+,@@SaveX1(a5)
  137.         move.l    (a0)+,@@SaveY1(a5)
  138.         move.l    (a0)+,@@SaveX2(a5)
  139.         move.l    (a0)+,@@SaveY2(a5)
  140.         move.l    (a0)+,@@CommentBufPtr(a5)
  141.         move.l    (a0)+,@@FileBufPtr(a5)
  142.         move.l    (a0)+,@@FileBufSize(a5)
  143.         move.l    (a0)+,@@Flag(a5)
  144.         tst.w    d0
  145.         SNE.b    @@UnSaved_Flag(a5)
  146.  
  147.         bsr    CheckScreen
  148.         bsr    InitVar
  149.  
  150.                         * PICファイルを開く
  151.         tst.b    @@UnSaved_Flag(a5)
  152.         AP_IFmac0100    *@ifcl    {
  153.             move.w    #$20,-(sp)
  154.             move.l    @@FileNamePtr(a5),-(sp)
  155.             DOS    _CREATE
  156.             addq.w    #6,sp
  157.             CheckDOSErr
  158.             move.w    d0,@@FileHandle(a5)
  159.         AP_ENDIFmac0100    *}
  160.  
  161. PicSave_:
  162.                         * バッファ128バイト未満は却下
  163.         tst.b    @@UnSaved_Flag(a5)
  164.         AP_IFmac0200    *@ifcl    {
  165.             cmpi.l    #128,@@FileBufSize(a5)
  166.             BCS    Err_FileBufSize
  167.         AP_ENDIFmac0200    *}
  168.  
  169.                         * ファイルバッファ
  170.         move.l    @@FileBufPtr(a5),BufPtrReg
  171.                         * ファイルバッファ残りバイト数
  172.         move.l    @@FileBufSize(a5),CountRestBufReg
  173.                         * ビットバッファ残りビット数
  174.         moveq.l    #16,BitCountReg
  175.                         * ビットバッファ
  176.         moveq.l    #0,BufTopReg
  177.  
  178.                         * PICヘッダを書き込む
  179.         move.w    @@FileHandle(a5),-(sp)
  180.         pea    PICHeader_mes(pc)
  181.         bsr    PutStr
  182.         addq.w    #6,sp
  183.                         * コメント
  184.         bsr    WriteComment
  185.         moveq.l    #$1a,d0
  186.                         * コメント終了
  187.         bsr    PutChar
  188.         moveq.l    #0,d0
  189.         bsr    PutChar
  190.         moveq.l    #0,d0
  191.                         * Mode(予約)
  192.         bsr    PutWord
  193.                         * 色ビット数
  194.         moveq.l    #15,d0
  195.         bsr    PutWord
  196.                         * Xドット数
  197.         move.w    @@SizeX(a5),d0
  198.         bsr    PutWord
  199.                         * Yドット数
  200.         move.w    @@SizeY(a5),d0
  201.         bsr    PutWord
  202.  
  203.         bsr    InitColorTable
  204.         bsr    SaveIt
  205.  
  206. ExitPicSave:
  207.                         * A5が壊れている可能性があるので復帰
  208.         move.l    A5Back(pc),a5
  209.                         * CRTC R20
  210.         move.b    @@CRTC_R20_Back(a5),($e80028)
  211.                         * 大域脱出用
  212.         move.l    @@Stack(a5),sp
  213.  
  214.         move.l    d0,-(sp)
  215.         tst.b    @@UnSaved_Flag(a5)
  216.         AP_IFmac0300    *@ifst    {
  217.             move.l    @@FileBufSize(a5),d0
  218.             sub.l    CountRestBufReg,d0
  219.             move.l    @@FileNamePtr(a5),a0
  220.             move.l    d0,(a0)
  221.          AP_ELSEmac0300    **} @else {
  222.             move.w    @@FileHandle(a5),-(sp)
  223.             DOS    _CLOSE
  224.             addq.w    #2,sp
  225.         AP_ENDIFmac0300    *}
  226.         move.l    (sp)+,d0
  227.  
  228.         rts
  229.  
  230.  
  231. A5Back:        ds.l    1
  232.  
  233.  
  234. *    *    *    *    *    *    *    *    *    *
  235.  
  236.  
  237. WriteComment:
  238. *        コメントを書き出す。
  239. *        拡張ヘッダを付属する。
  240.  
  241.         IPIC_WriteComment
  242.  
  243.  
  244. *    *    *    *    *    *    *    *    *    *
  245.  
  246.  
  247. InitVar:
  248. *        画面のアドレス計算などを行なう。領域チェックもする。
  249.  
  250.         move.l    d7,-(sp)
  251.  
  252.         move.l    @@Flag(a5),d7
  253.                         * セーブする領域が画面内に収まっているかどうかを調べる
  254.         move.l    @@SaveX2(a5),d1
  255.         AP_IFmac0400    *@ifmi    {
  256.                         * 位置指定がない
  257.             btst    #15,d7
  258.             BNE    Err_Rectangle
  259.             move.l    #511,d1
  260.             move.l    d1,@@SaveX2(a5)
  261.         AP_ENDIFmac0400    *}
  262.         move.l    @@SaveX1(a5),d0
  263.         AP_IFmac0500    *@ifmi    {
  264.                         * 位置指定がない
  265.             btst    #15,d7
  266.             BNE    Err_Rectangle
  267.             moveq.l    #0,d0
  268.             move.l    d0,@@SaveX1(a5)
  269.         AP_ENDIFmac0500    *}
  270.         cmp.l    d0,d1
  271.                         * d0(X1) =< d1(X2)にする
  272.         AP_IFmac0600    *@ifcs    {
  273.             exg.l    d0,d1
  274.             move.l    d0,@@SaveX1(a5)
  275.             move.l    d1,@@SaveX2(a5)
  276.         AP_ENDIFmac0600    *}
  277.         AP_IFmac0700    *@if [ btst.l #15,d7 ].cl {
  278.             cmpi.w    #512,d1
  279.             BHS    Err_Rectangle
  280.             sub.l    d0,d1
  281.             addq.l    #1,d1
  282.             cmpi.w    #512,d1
  283.             BHI    Err_Rectangle
  284.          AP_ELSEmac0700    **} @else {
  285.             sub.l    d0,d1
  286.             addq.l    #1,d1
  287.         AP_ENDIFmac0700    *}
  288.         move.w    d1,@@SizeX(a5)
  289.  
  290.         move.l    @@SaveY2(a5),d1
  291.         AP_IFmac0800    *@ifmi    {
  292.                         * 位置指定がない
  293.             btst    #15,d7
  294.             BNE    Err_Rectangle
  295.             move.l    #511,d1
  296.             move.l    d1,@@SaveY2(a5)
  297.         AP_ENDIFmac0800    *}
  298.         move.l    @@SaveY1(a5),d0
  299.         AP_IFmac0900    *@ifmi    {
  300.                         * 位置指定がない
  301.             btst    #15,d7
  302.             BNE    Err_Rectangle
  303.             move.l    #0,d0
  304.             move.l    d0,@@SaveY1(a5)
  305.         AP_ENDIFmac0900    *}
  306.         cmp.l    d0,d1
  307.         AP_IFmac0a00    *@ifcs    {
  308.                         * d0(Y1) =< d1(Y2)にする
  309.             exg.l    d0,d1
  310.             move.l    d0,@@SaveY1(a5)
  311.             move.l    d1,@@SaveY2(a5)
  312.         AP_ENDIFmac0a00    *}
  313.         AP_IFmac0b00    *@if [ btst.l #15,d7 ].cl {
  314.             cmpi.w    #512,d1
  315.             BHS    Err_Rectangle
  316.             sub.l    d0,d1
  317.             addq.l    #1,d1
  318.             cmpi.w    #512,d1
  319.             BHI    Err_Rectangle
  320.          AP_ELSEmac0b00    **} @else {
  321.             sub.l    d0,d1
  322.             addq.l    #1,d1
  323.         AP_ENDIFmac0b00    *}
  324.         move.w    d1,@@SizeY(a5)
  325.  
  326.                         * 1ラインのサイズを求める
  327.         move.w    #512*2,@@LineSize(a5)
  328.         AP_IFmac0c00    *@if [ btst.l #15,d7 ].st {
  329.             move.w    @@SizeX(a5),d0
  330.             addq.w    #7,d0
  331.             andi.w    #-8,d0
  332.             add.w    d0,d0
  333.             cmp.w    @@LineSize(a5),d0
  334.             AP_IFmac0d00    *@ifhi    {
  335.                 move.w    d0,@@LineSize(a5)
  336.             AP_ENDIFmac0d00    *}
  337.         AP_ENDIFmac0c00    *}
  338.  
  339.                         * 圧縮開始アドレスを求める
  340.         move.l    @@SaveY1(a5),d0
  341.         mulu    @@LineSize(a5),d0
  342.         move.l    @@SaveX1(a5),d1
  343.         ext.l    d1
  344.                         * +X*2
  345.         add.l    d1,d1
  346.         add.l    d1,d0
  347.                         * +GRAM_START
  348.         add.l    @@SaveBufPtr(a5),d0
  349.         move.l    d0,@@CompressPtr(a5)
  350.  
  351.                         * 1ライン展開後、次のラインに移る時のオフセットを求める
  352.         move.w    @@SizeX(a5),d0
  353.         add.w    d0,d0
  354.         move.w    @@LineSize(a5),d1
  355.         sub.w    d0,d1
  356.         move.w    d1,@@NextOffsetX(a5)
  357.  
  358.         move.l    (sp)+,d7
  359.         rts
  360.  
  361.  
  362. *    *    *    *    *    *    *    *    *    *
  363.  
  364.  
  365. CheckScreen:
  366. *        画面モードをチェックする。
  367.  
  368.  
  369.                         * CRTC R20
  370.         move.b    ($e80028),@@CRTC_R20_Back(a5)
  371.                         * VCR1
  372.         cmpi.b    #$03,($e82401)
  373.         BNE    Err_ScreenMode
  374.                         * CRTC R20
  375.         move.b    #$03,($e80028)
  376.  
  377.         rts
  378.  
  379.  
  380. *    *    *    *    *    *    *    *    *    *
  381.  
  382.  
  383. InitColorTable:
  384. *        カラーテーブルを初期化する。
  385. *        カラーテーブルはC[0]-C[1]-C[2]-C[3]-...-C[127]-C[0]のポインタリンク形式。
  386.  
  387.         IPIC_InitColorTable
  388.  
  389.  
  390. *    *    *    *    *    *    *    *    *    *
  391.  
  392.  
  393. SaveIt:
  394. *        圧縮メインルーチン
  395.  
  396.         move.l    @@CompressPtr(a5),CompressPtrReg
  397.         bsr    SetDiffFlag
  398.  
  399. *    *    *    *    *
  400.  
  401.         moveq.l    #0,ColorReg
  402.         move.w    (CompressPtrReg),ColorReg
  403.         not.w    ColorReg
  404.         moveq.l    #-1,LenReg
  405.                         * Y方向のカウンタ
  406.         move.w    @@SizeY(a5),d0
  407.         subq.w    #1,d0
  408.         AP_SREPEATmac0000    *@repeat [ d0 ].w {
  409.                         * 1画面圧縮
  410.             move.w    d0,-(sp)
  411.             moveq.l    #0,WidthXReg
  412.             move.w    @@SizeX(a5),WidthXReg
  413.             subq.w    #1,WidthXReg
  414.  
  415. *    *    *    *    *
  416. *        横連続を圧縮する
  417.  
  418. Compress1Line:
  419.                         * 1ライン圧縮
  420.             AP_SBLOCK0000:    *{
  421.                 addq.l    #1,LenReg
  422.                 move.w    (CompressPtrReg)+,ColorReg
  423.                 bclr    #0,ColorReg
  424.                 DBNE    WidthXReg,AP_SBLOCK0000    *dbst    WidthXReg,<
  425.             AP_EBLOCK0000:    *}
  426.             AP_IFmac0e00    *@ifst    {
  427.                 bsr    SaveLength
  428.  
  429. *    *    *    *    *
  430. *         色情報を書き出す    0xxxxxxx_xxxxxxxx    色コード(生情報)
  431. *                    1xxxxxxx        テーブル参照
  432.  
  433.                         * テーブルから色を探す
  434.                 lea    -SColorTableSize(a5),a0
  435.                 moveq.l    #128-1,d0
  436.                 AP_SBLOCK0100:    *{
  437.                     addq.w    #SColorTableSize,a0
  438.  
  439.     .ifdef SLOWER
  440.                     cmp.w    SColorTable_Col(a0),ColorReg
  441.     .else
  442.                     cmp.w    (a0),ColorReg
  443.     .endif
  444.  
  445.                     DBEQ    d0,AP_SBLOCK0100    *dbeq    d0,<
  446.                 AP_EBLOCK0100:    *}
  447.  
  448.                 AP_IFmac0f00    *@ifeq    {
  449.                         * テーブルにある
  450.                     eori.w    #127,d0
  451.                     moveq.l    #0,d1
  452.                     move.b    d0,d1
  453.                     ori.b    #$80,d1
  454.                     WriteBits    #8,d1
  455.                         * テーブルから色を取り出し、再登録
  456.  
  457.                         * テーブルオフセットにしておく
  458.     .ifdef SLOWER
  459.                     mulu    #SColorTableSize,d0
  460.     .else
  461.                     lsl.w    #3,d0
  462.     .endif
  463.  
  464.                         * 高速化のため。無理に使う必要はない。
  465.                     lea    (a5,d0.w),a0
  466.                     cmp.w    @@ColorTable_TopPtr(a5),d0
  467.                         * 最新色として登録
  468.                     AP_IFmac1000    *@ifne    {
  469.                         * C[x-1]-C[x]-C[x+1] -> C[x-1]-C[x+1]
  470.                         move.w    SColorTable_Next(a0),d1
  471.                         move.w    SColorTable_Prev(a0),d2
  472.                         move.w    d1,SColorTable_Next(a5,d2.w)
  473.                         move.w    d2,SColorTable_Prev(a5,d1.w)
  474.                         * C[127]-C[0] -> C[127]-C[new]-C[0]
  475.  
  476.                         move.w    @@ColorTable_TopPtr(a5),d1
  477.                         move.w    SColorTable_Prev(a5,d1.w),d2
  478.                         move.w    d1,SColorTable_Next(a0)
  479.                         move.w    d2,SColorTable_Prev(a0)
  480.                         move.w    d0,SColorTable_Next(a5,d2.w)
  481.                         move.w    d0,SColorTable_Prev(a5,d1.w)
  482.                         move.w    d0,@@ColorTable_TopPtr(a5)
  483.                     AP_ENDIFmac1000    *}
  484.  
  485.     .ifdef SLOWER
  486.                     move.w    SColorTable_Col(a0),ColorReg
  487.     .else
  488.                     move.w    (a0),ColorReg
  489.     .endif
  490.  
  491.  
  492.                  AP_ELSEmac0f00    **} @else {
  493.                         * 生情報
  494.                         * 色を読み込んでテーブルに登録
  495.                     moveq.l    #0,d0
  496.                     move.w    ColorReg,d0
  497.                     lsr.w    #1,d0
  498.                     WriteBits    #16,d0
  499.                         * リンクポインタの先頭からひとつ前へ戻って、
  500.                     move.w    @@ColorTable_TopPtr(a5),d0
  501.                     move.w    SColorTable_Prev(a5,d0.w),d0
  502.                         * そこを新しい先頭にする。
  503.                     move.w    d0,@@ColorTable_TopPtr(a5)
  504.                     move.w    ColorReg,SColorTable_Col(a5,d0.w)
  505.                 AP_ENDIFmac0f00    *}
  506.  
  507. *    *    *    *    *
  508. *         連鎖圧縮の準備
  509.  
  510. SaveChain:
  511.                         * YWidth
  512.                 move.w    (sp),d0
  513.                 move.w    WidthXReg,-(sp)
  514.                         * 連鎖圧縮時のポインタにする。+2になっているが、高速化のため。
  515.                 move.l    CompressPtrReg,ChainPtrReg
  516.                         * +2されているので-2しておく
  517.                 move.w    ColorReg,-(ChainPtrReg)
  518.                 AP_SBLOCK0200:    *{
  519.                     DBRA    d0,AP_EBLOCK0200    *dbra    d0,>
  520.                         * これ以上下へ行けない
  521.                     BRA    SaveChain_e
  522.                 AP_EBLOCK0200:    *}
  523.                 move.w    ColorReg,d1
  524.                         * 輝度ビットを立てておく
  525.                 addq.w    #1,d1
  526.                         * 左端を差す
  527.                 move.w    @@SizeX(a5),a0
  528.  
  529. *    *    *    *    *
  530. *         連鎖圧縮する        start---+---0(連鎖なし)
  531. *                        |
  532. *                    +-→+---1---+---00------+---0(連鎖終了)
  533. *                    |  連鎖あり |その他    |
  534. *                    |        +---01--+    +---1---+---0---+
  535. *                    |        |下1左1 |        |下1左2    |
  536. *                    ↑        +---10--+        +---1---+
  537. *                    |        |下1    |         下1右2    |
  538. *                    |        +---11--+            |
  539. *                    |         下1右1 |            |
  540. *                    +---------←--------+---------←--------+
  541. *
  542. *        ビットパターンと連鎖位置    O
  543. *                        |
  544. *                    +---+---+---+---+
  545. *                    0   0   1   1   0
  546. *                    0   1   0   1   0
  547. *                    1        1
  548. *                    0        1
  549.  
  550. PosXReg        reg    WidthXReg                * 使わせてもらいます
  551.  
  552.                         * 1つめの連鎖を見つける
  553.         SaveChain_1:
  554.                         * 1ライン下がる
  555.                 add.w    @@LineSize(a5),ChainPtrReg
  556.         SaveChain_1_C:
  557.                 cmp.w    (ChainPtrReg),d1
  558.                 AP_IFmac1100    *@ifeq    {
  559.                         * 連鎖発見
  560.                     SetBit
  561.                     BRA    SaveChain_2_C_
  562.                 AP_ENDIFmac1100    *}
  563.         SaveChain_1_L1:
  564.                 subq.w    #2,ChainPtrReg
  565.                 addq.w    #2/2,PosXReg
  566.                         * 左端チェック
  567.                 cmp.w    a0,PosXReg
  568.                 AP_IFmac1200    *@iflt    {
  569.                     cmp.w    (ChainPtrReg),d1
  570.                     AP_IFmac1300    *@ifeq    {
  571.                         * 連鎖発見
  572.                         SetBit
  573.                         BRA    SaveChain_2_L1_
  574.                     AP_ENDIFmac1300    *}
  575.                 AP_ENDIFmac1200    *}
  576.         SaveChain_1_R1:
  577.                 addq.w    #4,ChainPtrReg
  578.                 subq.w    #4/2,PosXReg
  579.                         * 右端チェック
  580.                 AP_IFmac1400    *@ifcc    {
  581.                     cmp.w    (ChainPtrReg),d1
  582.                     AP_IFmac1500    *@ifeq    {
  583.                         * 連鎖発見
  584.                         SetBit
  585.                         BRA    SaveChain_2_R1_
  586.                     AP_ENDIFmac1500    *}
  587.                 AP_ENDIFmac1400    *}
  588.         SaveChain_1_L2:
  589.                 subq.w    #6,ChainPtrReg
  590.                 addq.w    #6/2,PosXReg
  591.                         * 左端チェック
  592.                 cmp.w    a0,PosXReg
  593.                 AP_IFmac1600    *@iflt    {
  594.                     cmp.w    (ChainPtrReg),d1
  595.                     AP_IFmac1700    *@ifeq    {
  596.                         * 連鎖発見
  597.                         SetBit
  598.                         BRA    SaveChain_2_L2_
  599.                     AP_ENDIFmac1700    *}
  600.                 AP_ENDIFmac1600    *}
  601.         SaveChain_1_R2:
  602.                 addq.w    #8,ChainPtrReg
  603.                 subq.w    #8/2,PosXReg
  604.                         * 右端チェック
  605.                 AP_IFmac1800    *@ifcc    {
  606.                     cmp.w    (ChainPtrReg),d1
  607.                     AP_IFmac1900    *@ifeq    {
  608.                         * 連鎖発見
  609.                         SetBit
  610.                         BRA    SaveChain_2_R2_
  611.                     AP_ENDIFmac1900    *}
  612.                 AP_ENDIFmac1800    *}
  613.         SaveChain_1_e:
  614.                         * 連鎖はなかった
  615.                 BRA    SaveChain_e
  616.  
  617. *    *    *
  618.  
  619.                         * 2つめ以降の連鎖を見つける
  620.         SaveChain_2:
  621.  
  622. TempReg        reg    LenReg                    * 空きレジスタの有効活用
  623.  
  624.                         * 連鎖フラグを下ろす
  625.                 move.w    ColorReg,(ChainPtrReg)
  626.                 AP_SBLOCK0300:    *{
  627.                     DBRA    d0,AP_EBLOCK0300    *dbra    d0,>
  628.                         * これ以上下へ行けない
  629.                     BRA    SaveChain_2_e
  630.                 AP_EBLOCK0300:    *}
  631.                         * 1ライン下がる
  632.                 add.w    @@LineSize(a5),ChainPtrReg
  633.         SaveChain_2_C:
  634.                 cmp.w    (ChainPtrReg),d1
  635.                 AP_IFmac1a00    *@ifeq    {
  636.             SaveChain_2_C_:
  637.                         * 連鎖発見
  638.                     moveq.l    #2,TempReg
  639.                     WriteBits    #2,TempReg
  640.                     BRA    SaveChain_2
  641.                 AP_ENDIFmac1a00    *}
  642.         SaveChain_2_L1:
  643.                 subq.w    #2,ChainPtrReg
  644.                 addq.w    #2/2,PosXReg
  645.                         * 左端チェック
  646.                 cmp.w    a0,PosXReg
  647.                 AP_IFmac1b00    *@iflt    {
  648.                     cmp.w    (ChainPtrReg),d1
  649.                     AP_IFmac1c00    *@ifeq    {
  650.             SaveChain_2_L1_:
  651.                         * 連鎖発見
  652.                         moveq.l    #1,TempReg
  653.                         WriteBits    #2,TempReg
  654.                         BRA    SaveChain_2
  655.                     AP_ENDIFmac1c00    *}
  656.                 AP_ENDIFmac1b00    *}
  657.         SaveChain_2_R1:
  658.                 addq.w    #4,ChainPtrReg
  659.                 subq.w    #4/2,PosXReg
  660.                         * 右端チェック
  661.                 AP_IFmac1d00    *@ifcc    {
  662.                     cmp.w    (ChainPtrReg),d1
  663.                     AP_IFmac1e00    *@ifeq    {
  664.             SaveChain_2_R1_:
  665.                         * 連鎖発見
  666.                         moveq.l    #3,TempReg
  667.                         WriteBits    #2,TempReg
  668.                         BRA    SaveChain_2
  669.                     AP_ENDIFmac1e00    *}
  670.                 AP_ENDIFmac1d00    *}
  671.         SaveChain_2_L2:
  672.                 subq.w    #6,ChainPtrReg
  673.                 addq.w    #6/2,PosXReg
  674.                         * 左端チェック
  675.                 cmp.w    a0,PosXReg
  676.                 AP_IFmac1f00    *@iflt    {
  677.                     cmp.w    (ChainPtrReg),d1
  678.                     AP_IFmac2000    *@ifeq    {
  679.             SaveChain_2_L2_:
  680.                         * 連鎖発見
  681.                         moveq.l    #2,TempReg
  682.                         WriteBits    #4,TempReg
  683.                         BRA    SaveChain_2
  684.                     AP_ENDIFmac2000    *}
  685.                 AP_ENDIFmac1f00    *}
  686.         SaveChain_2_R2:
  687.                 addq.w    #8,ChainPtrReg
  688.                 subq.w    #8/2,PosXReg
  689.                         * 右端チェック
  690.                 AP_IFmac2100    *@ifcc    {
  691.                     cmp.w    (ChainPtrReg),d1
  692.                     AP_IFmac2200    *@ifeq    {
  693.             SaveChain_2_R2_:
  694.                         * 連鎖発見
  695.                         moveq.l    #3,TempReg
  696.                         WriteBits    #4,TempReg
  697.                         BRA    SaveChain_2
  698.                     AP_ENDIFmac2200    *}
  699.                 AP_ENDIFmac2100    *}
  700.         SaveChain_2_e:
  701.                         * 連鎖はもうない
  702.                 moveq.l    #0,TempReg
  703.                 WriteBits    #2,TempReg
  704.  
  705. SaveChain_e:
  706.                         * 連鎖終了
  707.                 ClrBit
  708.                 move.w    (sp)+,WidthXReg
  709.  
  710. PosXReg    reg    X    *ほんとはundefしたい・・・        * Thanks for WidthXReg!
  711. TempReg    reg    X    *ほんとはundefしたい・・・        * Thanks for LenReg!
  712.  
  713. *    *    *    *    *
  714. *        次の横連続圧縮に入る
  715.  
  716.                 moveq.l    #-1,LenReg
  717.                 DBRA    WidthXReg,Compress1Line
  718.             AP_ENDIFmac0e00    *}
  719.  
  720. *    *    *    *    *
  721. *        1ライン終了
  722.  
  723.             add.w    @@NextOffsetX(a5),CompressPtrReg
  724.  
  725. *    *    *    *    *
  726. *        1画面終了判定
  727.  
  728.             move.w    (sp)+,d0
  729.         AP_EREPEATmac0000    *}    * @endrepeat;
  730.         addq.l    #1,LenReg
  731.         bsr    SaveLength
  732.  
  733. *    *    *    *    *
  734. *        終了
  735.  
  736.         bsr    FlushBuf
  737.         moveq.l    #0,d0
  738.         rts
  739.  
  740.  
  741. *    *    *    *    *    *    *    *    *    *
  742.  
  743.  
  744. *        横方向へデータを比較し、色が変わるところにフラグを立てておく
  745.  
  746. SetDiffFlag:
  747.         move.l    CompressPtrReg,-(sp)
  748.  
  749.     .ifdef SLOWER
  750.                         * 輝度ビットマスク用データ
  751.         moveq.l    #$ffff_fffe,d3
  752.         move.w    (CompressPtrReg),ColorReg
  753.                         * 輝度ビットマスク
  754.         and.w    d3,ColorReg
  755.         not.w    ColorReg
  756.         move.w    @@SizeY(a5),d0
  757.         subq.w    #1,d0
  758.         AP_SREPEATmac0100    *@repeat [ d0 ].w {
  759.             move.w    d0,-(sp)
  760.             move.w    @@SizeX(a5),WidthXReg
  761.             subq.w    #1,WidthXReg
  762.             AP_SREPEATmac0200    *@repeat [ WidthXReg ].w {
  763.                 move.w    (CompressPtrReg),d0
  764.                         * 輝度ビットマスク
  765.                 and.w    d3,d0
  766.                 cmp.w    ColorReg,d0
  767.                         * フラグを立てる
  768.                 AP_IFmac2300    *@ifne    {
  769.                     move.w    d0,ColorReg
  770.                         * 輝度ビットを立てる
  771.                     addq.w    #1,d0
  772.                 AP_ENDIFmac2300    *}
  773.                 move.w    d0,(CompressPtrReg)+
  774.             AP_EREPEATmac0200    *}    * @endrepeat;
  775.             adda.w    @@NextOffsetX(a5),CompressPtrReg
  776.             move.w    (sp)+,d0
  777.         AP_EREPEATmac0100    *}    * @endrepeat;
  778.  
  779.     .else
  780.  
  781.         moveq.l    #$ffff_fffe,d3
  782.         move.w    (CompressPtrReg),ColorReg
  783.                         * 輝度ビットマスク
  784.         and.w    d3,ColorReg
  785.         not.w    ColorReg
  786.         move.w    @@SizeY(a5),d1
  787.         subq.w    #1,d1
  788.         AP_SREPEATmac0300    *@repeat [ d1 ].w {
  789.             move.w    @@SizeX(a5),WidthXReg
  790.             lsr.w    #1,WidthXReg
  791.             AP_IFmac2400    *@ifcs    {
  792.                 move.w    (CompressPtrReg),d0
  793.                         * 輝度ビットマスク
  794.                 and.w    d3,d0
  795.                 cmp.w    ColorReg,d0
  796.                         * フラグを立てる
  797.                 AP_IFmac2500    *@ifne    {
  798.                     move.w    d0,ColorReg
  799.                         * 輝度ビットを立てる
  800.                     addq.w    #1,d0
  801.                 AP_ENDIFmac2500    *}
  802.                 move.w    d0,(CompressPtrReg)+
  803.             AP_ENDIFmac2400    *}
  804.             AP_SBLOCK0400:    *{
  805.                 DBRA    WidthXReg,AP_EBLOCK0400    *dbra    WidthXReg,>
  806.                 BRA    SetDiffFlag_1
  807.             AP_EBLOCK0400:    *}
  808.             AP_SREPEATmac0400    *@repeat [ WidthXReg ].w {
  809.                 move.w    (CompressPtrReg),d0
  810.                         * 輝度ビットマスク
  811.                 and.w    d3,d0
  812.                 cmp.w    ColorReg,d0
  813.                         * フラグを立てる
  814.                 AP_IFmac2600    *@ifne    {
  815.                     move.w    d0,ColorReg
  816.                         * 輝度ビットを立てる
  817.                     addq.w    #1,d0
  818.                 AP_ENDIFmac2600    *}
  819.                 move.w    d0,(CompressPtrReg)+
  820.  
  821.                 move.w    (CompressPtrReg),d0
  822.                         * 輝度ビットマスク
  823.                 and.w    d3,d0
  824.                 cmp.w    ColorReg,d0
  825.                         * フラグを立てる
  826.                 AP_IFmac2700    *@ifne    {
  827.                     move.w    d0,ColorReg
  828.                         * 輝度ビットを立てる
  829.                     addq.w    #1,d0
  830.                 AP_ENDIFmac2700    *}
  831.                 move.w    d0,(CompressPtrReg)+
  832.             AP_EREPEATmac0400    *}    * @endrepeat;
  833. SetDiffFlag_1:
  834.             adda.w    @@NextOffsetX(a5),CompressPtrReg
  835.         AP_EREPEATmac0300    *}    * @endrepeat;
  836.  
  837.     .endif
  838.  
  839.         move.l    (sp)+,CompressPtrReg
  840.         rts
  841.  
  842.  
  843. *    *    *    *    *    *    *    *    *    *
  844.  
  845.  
  846.         IPIC_SaveSub
  847.  
  848.  
  849. *    *    *    *    *    *    *    *    *    *
  850.  
  851.  
  852. *    エラー処理
  853.  
  854. Err_FileBufSize:                * ファイルバッファサイズが異常
  855.                         * UserErr02
  856.         moveq.l    #-124+2,d0
  857.         BRA    ExitPicSave
  858. Err_Rectangle:                    * 座標が画面外
  859.                         * UserErr03
  860.         moveq.l    #-124+3,d0
  861.         BRA    ExitPicSave
  862. Err_ScreenMode:                    * 画面モードが正しくない
  863.                         * UserErr06
  864.         moveq.l    #-114+6,d0
  865.         BRA    ExitPicSave
  866. Err_WriteBuf:                    * ディスクがいっぱい
  867.         moveq.l    #-23,d0
  868.         BRA    ExitPicSave
  869.  
  870.  
  871. *    *    *    *    *    *    *    *    *    *
  872.  
  873.  
  874. PICHeader_mes:
  875.         dc.b    'PIC',0
  876.         .even
  877.  
  878.  
  879.         .include    %APStrMacro.$$$    *@STRSEC;
  880.         .even
  881.  
  882.  
  883. *    *    *    *    *    *    *    *    *    *
  884.  
  885.  
  886.  
  887.  
  888. *    *    *    *    *    *    *    *    *
  889. *    このファイルはパブリック・ドメインとなっています。    *
  890. *    改造・再配布・使用について必要な条件はありません。    *
  891. *    また、このファイルの使用による責務を作者である        *
  892. *    GORRYは負わないこととします。                *
  893. *    *    *    *    *    *    *    *    *
  894.  
  895.  
  896.  
  897.  
  898.